// 页面路径：store/index.js 
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);//vue的插件机制

//Vuex.Store 构造器选项
const store = new Vuex.Store({
    // state:{//存放状态
    //  购物车数组 
    // [
    //   {
    //     选中状态，自己去添加
    //     图片地址，后端给
    //     商品名称，后端给
    //     商品价格，后端给
    //     商品数量，自己去添加
    //     商品id   后端给
    //   } 
    // ]
    // }
    state: {
        cartList: uni.getStorageSync("cartList") || [],
        // 收货地址 {data,time}
        storageAddress: uni.getStorageSync("storageAddress"),
        // 用户凭据
        token: ""
    },
    getters: {

        // 获取真正的收货地址 data
        address(state) {
            /* 
            1 判断有没有收货地址 缓存 
            2 没有缓存 返回null 
            3 如果有缓存
              1 而且 时间  没有过期 返回 真正收货地址
              2 时间过期了 返回null 
      
            4 返回真实地址的情况
              1 缓存存在 而且不过期 就返回 真实数据
              2 其他 不管它
             */

            // if (state.storageAddress) {
            //   // 有缓存 -> 判断过期时间  5分钟

            //   if (Date.now() - state.storageAddress.time > 1000 * 60 * 5) {
            //     // 过期
            //     return null 
            //   } else {
            //     // 没有过期 返回真正地址
            //     return state.storageAddress.data;
            //   }

            // } else {
            //   // 没有缓存 返回 null
            //   return null;
            // }
            if (state.storageAddress && (Date.now() - state.storageAddress.time <= 1000 * 60 * 5)) {
                // 有缓存 而且没有过期
                return state.storageAddress.data;
            }

        },


        // 用户选中的商品数组
        checkedCartList(state) {
            return state.cartList.filter(goods => goods.checked);
        },
        // 总价格
        totalPrice(state, getters) {
            // 要的选中的商品的总价格！！  checkedCartList 就是过滤后选中的数组
            return getters.checkedCartList.reduce((sum, goods) => sum += goods.goods_price * goods.num, 0);
        },
        // 购买总数量 
        totalCount(state, getters) {
            return getters.checkedCartList.reduce((sum, goods) => sum += goods.num, 0);
        },
        // 判断是否要全选
        isAllChecked(state, getters) {
            return (
                // 空数组 使用every方法 返回值 true！！！
                state.cartList.length && state.cartList.every((goods) => goods.checked)
            );
        },
    },
    // 修改state mutations
    mutations: {
        // 添加数据到购物车
        setCartList(state, cartList) {
            state.cartList = cartList
            uni.setStorageSync("cartList", state.cartList);
        },
        // 添加收货地址
        setAddress(state, address) {
            state.storageAddress = { data: address, time: Date.now() };
            // 存一份到缓存中
            uni.setStorageSync("storageAddress", state.storageAddress)
        },
        // 设置token
        setToken(state, token) {
            state.token = token;
        }
    },
    actions: {
        // 获取token 异步
        async fetchToken(store) {
            const [err1, { encryptedData, rawData, iv, signature }] =
                await uni.getUserProfile({
                    desc: "用于给用户提供刚好体验",
                });

            const [err2, { code }] = await uni.login();

            // 拼接参数 获取token
            const tokenParams = {
                encryptedData,
                rawData,
                iv,
                signature,
                code,
            };

            // 发post请求 获取token  点两次按钮原因是因为 后端程序有bug 还没有修复！！！
            // 改为 uni
            const res3 = await uni.$u.post("/users/wxlogin", tokenParams);

            // 获取token
            const { token } = res3.message;

            store.commit("setToken", token);

            // return token;

        }
    }
})
export default store